#!/bin/bash 
#########################################
#批量下载caida数据工具，
# 要求：
# 平台：Linux
# 环境：可访问caida linux系统已经安装了curl (ubuntu/Debian apt-get install curl)
# author: Mervin.Wong<mervin0502@163.com>
# site:http://blog.mervin.me
# data:2013-8-06
# version: 0.1.2
#########################################
# 基本思想：三层循环
# 1，查找某年a
# 2, 查找a年的b月
# 3, 查找a年b月的第i次探测 
# 4, 查找a年b月的第i次探测的某个探测点(san-us)
#########################################
#下载的数据时间范围
#年 数组不得为空，表示下载那几年的数据
#实例：years=(2008 2012 2013);
years=(2012);
#月 不足两位的补0 例如01 05 09 ;数组可为空，表示01~12全部月份
#实例：months=(01 02 03 04 05 08 11);
months=(01);
#探测点,数组形式，可以下载多个探测点的数据；数组可为空，表示所有探测点
#实例：probes=(amw-us jfk-us);
probes=();
#第几次探测(周期)，如果为空，表示下载所有的探测数据
#实例：nums=(1 2 3 31);
nums=();
#数据存放目录
root="";
#日志文件
log=$root"/caida-ip-4-down.log";
#用户信息
name="XXX";
passwd="XXX";
#代理信息
proxy=http://ip:port
##########################################
#
# 以下数据不可修改
#
##########################################
#基本网址
url="https://topo-data.caida.org/topo-v6/list-8.ipv6.allpref/";
srcDir=$(pwd);
cd  $root;
user=$name":"$passwd;
#S:遍历年
for year in ${years[@]}
do
    pageByY=$url$year"/";
    msg=$(curl -x $proxy -u $user $pageByY);
    state=$(echo $msg | grep -c  'Not Found');
    if [ $state -eq 0 ];then
        #该年的数据存在
        if [[ !(-d $year) ]];then
            #$year 目录不存在，则创建
            mkdir $year;
        fi
        cd $year;

        #S:遍历月
        if [ ${#months[@]} -eq 0 ];then
            months=(01 02 03 04 05 06 07 08 09 10 11 12);
        fi
        for month in ${months[@]}
        do
            #判断$year$month是否存在
            pageByM=$pageByY$month"/";
            msg=$(curl -x $proxy -u $user  $pageByM);
            if [ $(echo $msg | grep -c -e "Not Found") -gt 0 ];then
                echo $pageByM;
                continue;
            fi

            #创建月目录并进入
            if [[ !(-d $month) ]];then
                mkdir $month
            fi
            cd $month;

            #获取$year$month的页面，并进行分析
            curl -x $proxy -u $user -o "../"$month".txt" $pageByM;
            echo  $(date +%Y-%m-%d\ %H:%M:%S)" Download:"$pageByM >> $log;         

            #匹配查找
            str="topo-v6\.l8\.$year$month[0-3][0-9]";
            #str="topo-v6\.l8\.$year$month[0-3][0-9]\.[0-9]\+\.[0-9a-zA-Z-]\+\(\.warts\.gz\)";
            let i=1;
            pre="0";
            #获取本月提交数据的日期
            days=$(grep -o -i  -e ">"$str  "../"$month".txt"  |  grep -o -i "[0-3][0-9]\$");
            for e in ${days[@]}
            do 
                if [ "$pre" != "$e" ];then
                    date[$i]=$e;
                    pre=$e;
                    let i+=1;
                fi
            done

            #如果nums为空，则遍历所有
            if [ ${#nums[@]} -eq 0 ];then
                let i=1;
                for i in $(seq ${#date[@]})
                do
                    nums[$i]=$i;
                    let i+=1;
                done
            fi

            #S:遍历$nums
            for num in ${nums[@]}
            do
                day=${date[$num]}; #获取第num次所对应的日期

                #S:遍历探测点
                if [ ${#probes[@]} -eq 0 ];then
                        #$probes为空，选择所有探测点
                        str="topo-v6\.l8\.$year$month$day\.[0-9]\+\.[0-9a-zA-Z-]\+\(\.warts\.gz\)";
                        grep -o -i -e ">"$str  "../"$month".txt" | while read line;do
                            line=${line:1:${#line}-1};
                            if [[ (-f $line) ]];then
                                echo -e "\033[44;37;5m "$year"-"$month"-"$line Existed!" \033[0m";
                            else
                                pageByN=$pageByM$line;
                                curl -x $proxy -u $user -O $pageByN;
                                #touch $line;
                                echo -e "\033[44;37;5m "$year"-"$month"-"$line" \033[0m";
                            fi
                             echo  $(date +%Y-%m-%d\ %H:%M:%S)" Download: "$pageByM$line >>$log;
                        done
                else
                    for probe in ${probes[@]}
                    do
                        str="topo-v6\.l8\.$year$month$day\.[0-9]\+\.${probe}\(\.warts\.gz\)";
                        line=$(grep -o -i -e ">"$str  "../"$month".txt");
                        line=${line:1:${#line}-1};
                        if [[ (-f $line) ]];then
                            echo -e "\033[44;37;5m "$year"-"$month"-"$line Existed!" \033[0m";
                        else
                            pageByN=$pageByM$line;
                            curl -x $proxy -u $user -O $pageByN;
                            #touch $line;
                            echo -e "\033[44;37;5m "$year"-"$month"-"$line" \033[0m";
                        fi
                           echo $(date +%Y-%m-%d\ %H:%M:%S)" Download: "$pageByM$line >> $log;
                    done
                fi
                #E:遍历探测点
            done
            #E:遍历$nums
	    rm -f $month".txt";
            cd ../ #退出$month目录 
        done
        #E:遍历月
        rm -f $year".txt"
        cd ../ #退出$year目录
    fi # state year    
done 
#E: 遍历年
cd $srcDir;
